import { getLabelByVal } from '@/utils/commons'

const transform2Enum = (enums, { propDesc = 'label', propValue = 'value' } = {}) => {
  if (!Array.isArray(enums)) {
    console.warn(` enums 必须是一个数组`)
    return Array.of()
  }
  return enums.reduce((acc, { [propDesc]: k, [propValue]: v }) =>
    ({ ...acc, [k]: v, [v]: k }), Object.create(null))
}

class EnumObj {
  constructor(enumTypes) {
    this.enumGetterFn = getLabelByVal(enumTypes)
  }

  /**
   * 用户自定义的返回
   * @param v valueProp 的值
   * @param retPropName 返回的属性名
   * @return {string}
   */
  getProp(v, retPropName) {
    return this.enumGetterFn(v, retPropName)
  }

  /**
   * 常用的其他获取
   * @param v valueProp 的值
   * @return {string}
   */
  getTagByValue(v) {
    return this.enumGetterFn(v, 'status')
  }
}

//  扩展
const extend = (enumObj, {} = {}) => {
  // const _c = Object.create(enumObj)

  //  一些扩展插件,日后完善

  //  getAll

  //  contains

}

//  返回枚举对象
const createEnumFactory = (enumList) => {
  return enumList|> transform2Enum
  |> (v => Object.setPrototypeOf(v, new EnumObj(enumList)))
}

export { createEnumFactory }

